#pragma once
#include "cppjieba/Jieba.hpp"
#include "utfcpp/utf8.h"

#include <iostream>
#include <vector>
#include <string>
#include <set>
#include <map>

/*
    用set容器存储停用词，红黑树基础，方便频繁查找，只需要开始初始化一次
*/

class KeywordProcessor
{
public:
    // 构造函数：初始化分词器和停用词集合
    KeywordProcessor();

    // 接收语料库的目录路径，调用方法生成词典库和索引库
    void process(const std::string &chDir, const std::string &enDir);

    void show_en_dict();
    void show_en_index();

private:
    bool isChineseWord(const std::string &word);

    // 加载停用词
    void load_stopword(const std::string &file, std::set<std::string> &stop_word);

    // en词典库和索引库
    void create_en_dirct(const std::string &Dir, const std::string &outfile);

    void build_en_index(const std::string &dict, const std::string &index);

    void create_cn_dirct(const std::string &Dir, const std::string &outfile);

    void build_cn_index(const std::string &dict, const std::string &index);

private:
    // 存储分词器和停用词
    // 1.初始化cppjieba分词器
    cppjieba::Jieba m_tokenizer;

    std::set<std::string> m_enStopword; // en停用词

    std::set<std::string> m_cnStopword; // cn停用词

    std::map<std::string, int> m_enDict;                  // 统计词典库
    std::map<std::string, int> m_cnDict;                  // 统计词典库
    std::vector<std::pair<std::string, int>> m_vecenDict; // 计算索引库
    std::vector<std::pair<std::string, int>> m_veccnDict; // 计算索引库
    std::map<std::string, std::set<int>> m_enindex;       // 索引库
    std::map<std::string, std::set<int>> m_cnindex;       // 索引库
};
